/*
 * Copyright (c) 2012 Johann Hanne
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

#include <stdint.h>
#include <ctype.h>

const uint8_t _is_table[256] = {
    /* 0x00 */ 0,
    /* 0x01 */ 0,
    /* 0x02 */ 0,
    /* 0x03 */ 0,
    /* 0x04 */ 0,
    /* 0x05 */ 0,
    /* 0x06 */ 0,
    /* 0x07 */ 0,
    /* 0x08 */ 0,
    /* 0x09 '\t' */ _IS_BLANK                             |_IS_SPACE,
    /* 0x0a '\n' */                                        _IS_SPACE,
    /* 0x0b '\v' */                                        _IS_SPACE,
    /* 0x0c '\f' */                                        _IS_SPACE,
    /* 0x0d '\r' */                                        _IS_SPACE,
    /* 0x0e */ 0,
    /* 0x0f */ 0,
    /* 0x10 */ 0,
    /* 0x11 */ 0,
    /* 0x12 */ 0,
    /* 0x13 */ 0,
    /* 0x14 */ 0,
    /* 0x15 */ 0,
    /* 0x16 */ 0,
    /* 0x17 */ 0,
    /* 0x18 */ 0,
    /* 0x19 */ 0,
    /* 0x1a */ 0,
    /* 0x1b */ 0,
    /* 0x1c */ 0,
    /* 0x1d */ 0,
    /* 0x1e */ 0,
    /* 0x1f */ 0,
    /* 0x20 ' ' */ _IS_BLANK          |_IS_PRINT                    |_IS_SPACE,
    /* 0x21 '!' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x22 '"' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x23 '#' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x24 '$' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x25 '%' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x26 '&' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x27 '\'' */                    _IS_PRINT          |_IS_PUNCT,
    /* 0x28 '('*/                      _IS_PRINT          |_IS_PUNCT,
    /* 0x29 ')' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x2a '*' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x2b '+' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x2c ',' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x2d '-' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x2e '.' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x2f '/' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x30 '0' */           _IS_DIGIT|_IS_PRINT                                        |_IS_XDIGIT,
    /* 0x31 '1' */           _IS_DIGIT|_IS_PRINT                                        |_IS_XDIGIT,
    /* 0x32 '2' */           _IS_DIGIT|_IS_PRINT                                        |_IS_XDIGIT,
    /* 0x33 '3' */           _IS_DIGIT|_IS_PRINT                                        |_IS_XDIGIT,
    /* 0x34 '4' */           _IS_DIGIT|_IS_PRINT                                        |_IS_XDIGIT,
    /* 0x35 '5' */           _IS_DIGIT|_IS_PRINT                                        |_IS_XDIGIT,
    /* 0x36 '6' */           _IS_DIGIT|_IS_PRINT                                        |_IS_XDIGIT,
    /* 0x37 '7' */           _IS_DIGIT|_IS_PRINT                                        |_IS_XDIGIT,
    /* 0x38 '8' */           _IS_DIGIT|_IS_PRINT                                        |_IS_XDIGIT,
    /* 0x39 '9' */           _IS_DIGIT|_IS_PRINT                                        |_IS_XDIGIT,
    /* 0x3a ':' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x3b ';' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x3c '<' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x3d '=' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x3e '>' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x3f '?' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x40 '@' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x41 'A' */                     _IS_PRINT                              |_IS_UPPER|_IS_XDIGIT,
    /* 0x42 'B' */                     _IS_PRINT                              |_IS_UPPER|_IS_XDIGIT,
    /* 0x43 'C' */                     _IS_PRINT                              |_IS_UPPER|_IS_XDIGIT,
    /* 0x44 'D' */                     _IS_PRINT                              |_IS_UPPER|_IS_XDIGIT,
    /* 0x45 'E' */                     _IS_PRINT                              |_IS_UPPER|_IS_XDIGIT,
    /* 0x46 'F' */                     _IS_PRINT                              |_IS_UPPER|_IS_XDIGIT,
    /* 0x47 'G' */                     _IS_PRINT                              |_IS_UPPER,
    /* 0x48 'H' */                     _IS_PRINT                              |_IS_UPPER,
    /* 0x49 'I' */                     _IS_PRINT                              |_IS_UPPER,
    /* 0x4a 'J' */                     _IS_PRINT                              |_IS_UPPER,
    /* 0x4b 'K' */                     _IS_PRINT                              |_IS_UPPER,
    /* 0x4c 'L' */                     _IS_PRINT                              |_IS_UPPER,
    /* 0x4d 'M' */                     _IS_PRINT                              |_IS_UPPER,
    /* 0x4e 'N' */                     _IS_PRINT                              |_IS_UPPER,
    /* 0x4f 'O' */                     _IS_PRINT                              |_IS_UPPER,
    /* 0x50 'P' */                     _IS_PRINT                              |_IS_UPPER,
    /* 0x51 'Q' */                     _IS_PRINT                              |_IS_UPPER,
    /* 0x52 'R' */                     _IS_PRINT                              |_IS_UPPER,
    /* 0x53 'S' */                     _IS_PRINT                              |_IS_UPPER,
    /* 0x54 'T' */                     _IS_PRINT                              |_IS_UPPER,
    /* 0x55 'U' */                     _IS_PRINT                              |_IS_UPPER,
    /* 0x56 'V' */                     _IS_PRINT                              |_IS_UPPER,
    /* 0x57 'W' */                     _IS_PRINT                              |_IS_UPPER,
    /* 0x58 'X' */                     _IS_PRINT                              |_IS_UPPER,
    /* 0x59 'Y' */                     _IS_PRINT                              |_IS_UPPER,
    /* 0x5a 'Z' */                     _IS_PRINT                              |_IS_UPPER,
    /* 0x5b '[' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x5c '\\' */                    _IS_PRINT          |_IS_PUNCT,
    /* 0x5d ']' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x5e '^' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x5f '_' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x60 '`' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x61 'a' */                     _IS_PRINT|_IS_LOWER                              |_IS_XDIGIT,
    /* 0x62 'b' */                     _IS_PRINT|_IS_LOWER                              |_IS_XDIGIT,
    /* 0x63 'c' */                     _IS_PRINT|_IS_LOWER                              |_IS_XDIGIT,
    /* 0x64 'd' */                     _IS_PRINT|_IS_LOWER                              |_IS_XDIGIT,
    /* 0x65 'e' */                     _IS_PRINT|_IS_LOWER                              |_IS_XDIGIT,
    /* 0x66 'f' */                     _IS_PRINT|_IS_LOWER                              |_IS_XDIGIT,
    /* 0x67 'g' */                     _IS_PRINT|_IS_LOWER,
    /* 0x68 'h' */                     _IS_PRINT|_IS_LOWER,
    /* 0x69 'i' */                     _IS_PRINT|_IS_LOWER,
    /* 0x6a 'j' */                     _IS_PRINT|_IS_LOWER,
    /* 0x6b 'k' */                     _IS_PRINT|_IS_LOWER,
    /* 0x6c 'l' */                     _IS_PRINT|_IS_LOWER,
    /* 0x6d 'm' */                     _IS_PRINT|_IS_LOWER,
    /* 0x6e 'n' */                     _IS_PRINT|_IS_LOWER,
    /* 0x6f 'o' */                     _IS_PRINT|_IS_LOWER,
    /* 0x70 'p' */                     _IS_PRINT|_IS_LOWER,
    /* 0x71 'q' */                     _IS_PRINT|_IS_LOWER,
    /* 0x72 'r' */                     _IS_PRINT|_IS_LOWER,
    /* 0x73 's' */                     _IS_PRINT|_IS_LOWER,
    /* 0x74 't' */                     _IS_PRINT|_IS_LOWER,
    /* 0x75 'u' */                     _IS_PRINT|_IS_LOWER,
    /* 0x76 'v' */                     _IS_PRINT|_IS_LOWER,
    /* 0x77 'w' */                     _IS_PRINT|_IS_LOWER,
    /* 0x78 'x' */                     _IS_PRINT|_IS_LOWER,
    /* 0x79 'y' */                     _IS_PRINT|_IS_LOWER,
    /* 0x7a 'z' */                     _IS_PRINT|_IS_LOWER,
    /* 0x7b '{' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x7c '|' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x7d '}' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x7e '~' */                     _IS_PRINT          |_IS_PUNCT,
    /* 0x7f */ 0,
    /* 0x80 */ 0,
    /* 0x81 */ 0,
    /* 0x82 */ 0,
    /* 0x83 */ 0,
    /* 0x84 */ 0,
    /* 0x85 */ 0,
    /* 0x86 */ 0,
    /* 0x87 */ 0,
    /* 0x88 */ 0,
    /* 0x89 */ 0,
    /* 0x8a */ 0,
    /* 0x8b */ 0,
    /* 0x8c */ 0,
    /* 0x8d */ 0,
    /* 0x8e */ 0,
    /* 0x8f */ 0,
    /* 0x90 */ 0,
    /* 0x91 */ 0,
    /* 0x92 */ 0,
    /* 0x93 */ 0,
    /* 0x94 */ 0,
    /* 0x95 */ 0,
    /* 0x96 */ 0,
    /* 0x97 */ 0,
    /* 0x98 */ 0,
    /* 0x99 */ 0,
    /* 0x9a */ 0,
    /* 0x9b */ 0,
    /* 0x9c */ 0,
    /* 0x9d */ 0,
    /* 0x9e */ 0,
    /* 0x9f */ 0,
    /* 0xa0 */ 0,
    /* 0xa1 */ 0,
    /* 0xa2 */ 0,
    /* 0xa3 */ 0,
    /* 0xa4 */ 0,
    /* 0xa5 */ 0,
    /* 0xa6 */ 0,
    /* 0xa7 */ 0,
    /* 0xa8 */ 0,
    /* 0xa9 */ 0,
    /* 0xaa */ 0,
    /* 0xab */ 0,
    /* 0xac */ 0,
    /* 0xad */ 0,
    /* 0xae */ 0,
    /* 0xaf */ 0,
    /* 0xb0 */ 0,
    /* 0xb1 */ 0,
    /* 0xb2 */ 0,
    /* 0xb3 */ 0,
    /* 0xb4 */ 0,
    /* 0xb5 */ 0,
    /* 0xb6 */ 0,
    /* 0xb7 */ 0,
    /* 0xb8 */ 0,
    /* 0xb9 */ 0,
    /* 0xba */ 0,
    /* 0xbb */ 0,
    /* 0xbc */ 0,
    /* 0xbd */ 0,
    /* 0xbe */ 0,
    /* 0xbf */ 0,
    /* 0xc0 */ 0,
    /* 0xc1 */ 0,
    /* 0xc2 */ 0,
    /* 0xc3 */ 0,
    /* 0xc4 */ 0,
    /* 0xc5 */ 0,
    /* 0xc6 */ 0,
    /* 0xc7 */ 0,
    /* 0xc8 */ 0,
    /* 0xc9 */ 0,
    /* 0xca */ 0,
    /* 0xcb */ 0,
    /* 0xcc */ 0,
    /* 0xcd */ 0,
    /* 0xce */ 0,
    /* 0xcf */ 0,
    /* 0xd0 */ 0,
    /* 0xd1 */ 0,
    /* 0xd2 */ 0,
    /* 0xd3 */ 0,
    /* 0xd4 */ 0,
    /* 0xd5 */ 0,
    /* 0xd6 */ 0,
    /* 0xd7 */ 0,
    /* 0xd8 */ 0,
    /* 0xd9 */ 0,
    /* 0xda */ 0,
    /* 0xdb */ 0,
    /* 0xdc */ 0,
    /* 0xdd */ 0,
    /* 0xde */ 0,
    /* 0xdf */ 0,
    /* 0xe0 */ 0,
    /* 0xe1 */ 0,
    /* 0xe2 */ 0,
    /* 0xe3 */ 0,
    /* 0xe4 */ 0,
    /* 0xe5 */ 0,
    /* 0xe6 */ 0,
    /* 0xe7 */ 0,
    /* 0xe8 */ 0,
    /* 0xe9 */ 0,
    /* 0xea */ 0,
    /* 0xeb */ 0,
    /* 0xec */ 0,
    /* 0xed */ 0,
    /* 0xee */ 0,
    /* 0xef */ 0,
    /* 0xf0 */ 0,
    /* 0xf1 */ 0,
    /* 0xf2 */ 0,
    /* 0xf3 */ 0,
    /* 0xf4 */ 0,
    /* 0xf5 */ 0,
    /* 0xf6 */ 0,
    /* 0xf7 */ 0,
    /* 0xf8 */ 0,
    /* 0xf9 */ 0,
    /* 0xfa */ 0,
    /* 0xfb */ 0,
    /* 0xfc */ 0,
    /* 0xfd */ 0,
    /* 0xfe */ 0,
    /* 0xff */ 0
};
